前言

在写前端的时候,非常喜欢那种一写完就能立马看到自己代码效果的过程。在iOS开发过程中,编写界面代码时需要查看界面的布局或者颜色等是否符合要求,此时重新编译整个项目 -> 安装到模拟器 -> 启动项目 -> 进入相关页面,界面开发过程中一大半的时间浪费在这无谓的等待上。一天躺在床上,思考着有这么多的神级前辈开发过iOS,他们在开发界面的时候也是这样等待吗,效率如此低下的工作会发生在他们身上吗?我觉的其中必要蹊跷,应该会有界面实施预览的工具,上网一搜,果然,其中推荐最多的还是 johnno1962 编写的 injectionforxcode Xcode插件。

😆记录下我使用的第一款Xcode插件~

Injection GitHub: Injection Plugin for Xcode

安装

话不多说,咱们先来安装下这款插件

从ReadMe可以知道

With Xcode, either install via Alcatraz, or install by cloning this repo and build InjectionPluginLite/InjectionPlugin.xcodeproj. If you are building locally, note that you need to restart Xcode to load the plugin. A popup should appear asking to confirm loading a plugin not signed by Apple, that signals that the plugin is set up.

可以使用老牌Xcode包管理工具 Alcatraz,不过由于这款工具不再支持Xcode8,在Xcode8上安装需要代码签名啥的,而且目前我只需要安装Injection这一款插件所以我就直接来Git上查看其他的安装方法。

1. 编译 InjectionPlugin.xcodeproj (推荐)

  • Clone或者Download该项目,打开 InjectionPluginLite/InjectionPlugin.xcodeproj 工程文件,在Xcode上编译。

  • 编译成功后,重启Xcode

  • 此时Xcode会提示你是否加载该插件,选择 “Load Bundle”

提示是否加载该插件

  • 安装成功

2. 下载App

下载地址: Injection II, the App

安装客户端,两者装完之后操作都一样

个人推荐第一种安装方法,前者是将插件集成到Xcode里,启动Xcode后就不用另外启动App。

使用

以第一种安装方法为例,安装好后Xcode的 “Product” 选项中可以在最下面看到多出两个选项

菜单

以Swift为例,在项目目录下创建文件名为 main.m 的文件,然后选择 “Product” -> “Injection Plugin” -> “Patch project for injection”

之后会在 main.m 文件中添加几行代码,这并不会对你的程序有任何的影响。

编辑任意一个界面控制文件,修改内容后,按下 Ctrl + = 快捷键,可以看到左上方有一个进度条,此时就可以看到界面的更改啦~

注意实现

刚开始的时候我编辑的配置文件,因为在一些控制器里面会读取到这些内容,所以我在打开配置文件的情况下按下快捷键 Ctrl + =,结果出错,经过一上午的捣鼓,发现这款插件要在控制器文件下使用,比如:你更改了配置文件,你要在相应界面的ViewController下去 Ctrl + =,才会不报错。

在我打开ViewController的情况下,更改了内容,但是按下 Ctrl + =,提示以下信息,并且页面没有任何变化。

1
2
3
Compiling /Users/abc1/Desktop/GongGongiOS/GongGong/GongGong/MeVC.swift
objc[5630]: Class _TtC8GongGong4MeVC is implemented in both /Users/abc1/Library/Developer/CoreSimulator/Devices/3EABA886-CFF9-42CE-B269-757BD06797E5/data/Containers/Bundle/Application/97B1C2C4-AD99-444B-8A20-0E62445CF226/GongGong.app/GongGong (0x109e985d0) and /Users/abc1/Desktop/GongGongiOS/GongGong/iOSInjectionProject/build/Debug-iphonesimulator/InjectionBundle11.bundle/InjectionBundle (0x11f1cf3b0). One of the two will be used. Which one is undefined.
2017-08-16 11:42:32.171 GongGong[5630:203662] Ignore any warning, Swizzled GongGong.MeVC 0x11f1cf3b0 -> 0x109e985d0

到作者的issue上看到了类似的问题: my injection doesn’t work

作者对这个warning给出的解释大概是可以无视这个warning -=-

并且作者详细说了,在更新界面的时候必须调用 viewDidLoad 方法。

此时返回ReadMe,发现作者也给出了方法

Callbacks in Your Code

You can build on top of Injection from three callbacks:

  • -(void)injected as an instance method, which gives you the chance to re-update an object with new contexts.
  • +(void)injected as a class method, making it possible to update globals with new information
  • Listening for INJECTION_BUNDLE_NOTIFICATION, allowing other classes to listen out for injection calls, this is useful for providing app level changes.

由于我使用的Swift,我在viewController中添加

1
2
3
func injected() {
self. viewDidLoad()
}

结果报错

报错

非常无奈,结果仔细一看上面说明中的第三条,还可以添加Notification监听,果断尝试了一下,在 viewDidLoad 中添加如下代码:

1
NotificationCenter.default.addObserver(self, selector: #selector(refresh), name: NSNotification.Name(rawValue: "INJECTION_BUNDLE_NOTIFICATION"), object: nil)

然后在class中添加:

1
2
3
func refresh() {
self.viewDidLoad()
}

尝试一下

演示GIF

完美~

更多功能大家可以在GitHub上去查看,我就不多啰嗦了~感谢观看


发布时间: 2017-08-16 11:09:14

原始链接: UI调试神器 —— Injection for Xcode(Xcode插件)

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。